package bll

import (
	"github.com/gogf/gf/v2/net/ghttp"
)

type sMiddleware struct{}

// 中间件管理服务
func Middleware() *sMiddleware {
	return &sMiddleware{}
}

// 允许跨域
func (s *sMiddleware) CORS(r *ghttp.Request) {
	r.Response.CORSDefault()
	// r.Response.DefaultCORSOptions()
	r.Middleware.Next()
}

// 自定义上下文对象
//func (s *sMiddleware) Ctx(r *ghttp.Request) {
//	// 初始化，务必最开始执行
//	customCtx := &model2.Context{
//		// Session: r.Session,
//		Data: make(g.Map),
//	}
//	Context().Init(r, customCtx)
//	// 执行下一步请求逻辑
//	r.Middleware.Next()
//}
//
//// 简单token中间件
//func (s *sMiddleware) AuthToken(r *ghttp.Request) {
//	_ctx := r.Context()
//	_auth := Auth()
//	_auth.MiddlewareFunc()(r)
//	// 获取token，如果token有时效，可以做刷新令牌
//	authHeader := r.GetHeader("Authorization")
//	if authHeader != "" {
//		parts := strings.SplitN(authHeader, " ", 2)
//		if !(len(parts) == 2 && parts[0] == "Bearer") {
//			response.JsonExit(r, 1, "未登录或非法访问!")
//		} else if parts[1] == "" {
//			response.JsonExit(r, 1, "未登录或非法访问!")
//		}
//		token := parts[1]
//		Context().SetData(r.Context(), g.Map{"token": token})
//		//fmt.Println("当前token是", token)
//		//解析验证token
//		token_obj := _auth.GetPayload(_ctx)
//		token_map := gconv.Map(token_obj)
//		token_nowtime := gtime.Now().Timestamp()
//		if token_nowtime > gconv.Int64(token_map["exp"]) {
//			response.JsonExit(r, 1, "token已过期!")
//		} else {
//			_user_id := gconv.String(token_map["user_id"])
//			var _user entity.SysUser
//			_rc, _err := dao.SysUser.Ctx(_ctx).One("uuid=?", _user_id)
//			_rc.Struct(&_user)
//			if _err == nil && _user.Uuid != "" {
//				if _user.Status == "1" {
//					response.JsonExit(r, 1, "当前用户已被停用!")
//				} else {
//					ctxUser := new(model2.ContextUser)
//					//用户信息
//					ctxUser.User = &_user
//					//用户角色信息
//					roleEntitys, _ := SysUserRole().GetRoles(_ctx, _user_id)
//					ctxUser.Roles = roleEntitys.Roles
//					ctxUser.RoleIds = roleEntitys.RoleIds
//					ctxUser.RoleNames = roleEntitys.RoleNames
//					Context().SetUser(r.Context(), ctxUser)
//				}
//			} else {
//				response.JsonExit(r, 1, "token身份信息不存在!")
//			}
//		}
//		r.Middleware.Next()
//	} else {
//		response.JsonExit(r, 1, "token信息不能为空!")
//	}
//}
//
//// 接口操作权限验证
//func (s *sMiddleware) AuthApi(r *ghttp.Request) {
//	ctx := r.Context()
//
//	roleIds := gconv.Uints(Context().Get(ctx).UserInfo.RoleIds)
//	if len(roleIds) == 0 {
//		response.JsonExit(r, 500, "没有角色权限")
//	}
//	// 角色id为1的，拥有全部权限
//	for _, i := range roleIds {
//		if i == 1 {
//			r.Middleware.Next()
//			return
//		}
//	}
//
//	// 获取访问地址对应的菜单信息，status==0启用中的菜单
//	menuEntity, err := SysMenu().List(ctx, model2.SysMenuSearchIntIut{Status: 0})
//	if err != nil {
//		response.JsonExit(r, 501, "请求数据失败!")
//	}
//	url := gstr.TrimLeft(r.Request.URL.Path, "/api")
//	var menu *model2.SysMenuOne
//	for _, m := range menuEntity {
//		ms := gstr.SubStr(m.Auth, 0, gstr.Pos(m.Auth, "?"))
//		if m.Auth == url || ms == url {
//			menu = m
//			break
//		}
//	}
//	//只验证存在数据库中的规则
//	if menu != nil {
//		//若存在不需要验证的条件则跳过
//		if menu.Auth == "1" {
//			r.Middleware.Next()
//			return
//		}
//		// 验证访问地址的菜单id是否包含在角色绑定的菜单中
//		var menuIds []string
//		dao.CasbinRule.Ctx(ctx).Fields("v1").Where(" v0 IN(?)", gconv.Strings(roleIds)).Scan(&menuIds)
//		//menuIds, err := SysRoleMenu().GetMenuIds(ctx, roleIds)
//		if err != nil {
//			response.JsonExit(r, 501, "请求数据失败!")
//		}
//		hasAccess := false
//		for _, i := range menuIds {
//			if menu.Uuid == i {
//				hasAccess = true
//				break
//			}
//		}
//		if !hasAccess {
//			response.JsonExit(r, 502, "没有访问权限!")
//		}
//	}
//	//else {
//	//	response.JsonExit(r, 502, "没有访问权限!")
//	//}
//
//	r.Middleware.Next()
//}
//
//// 返回处理中间件
//func (s *sMiddleware) ResponseHandler(r *ghttp.Request) {
//	r.Middleware.Next()
//	SysOperLog().Create(r.Context())
//	// 如果已经有返回内容，那么该中间件什么也不做
//	if r.Response.BufferLength() > 0 {
//		return
//	}
//
//	var (
//		err = r.GetError()
//		res = r.GetHandlerResponse()
//	)
//
//	if err != nil {
//		code := gerror.Code(err)
//		if code == gcode.CodeNil {
//			code = gcode.CodeInternalError
//		}
//		response.JsonExit(r, code.Code(), err.Error())
//	} else {
//		r.Response.WriteJson(res)
//	}
//}
